package org.convallaria.system.biz.util;

import org.convallaria.framework.common.constants.sys.ConfigConstants;
import org.convallaria.system.biz.entity.SysConfig;

/**
 * 系统参数配置工具类
 * 
 * 功能特性：
 * - 提供配置相关的业务逻辑判断方法
 * - 提供配置类型等描述信息
 * - 提供配置数据验证方法
 * - 提供配置信息格式化方法
 * 
 * 设计原则：
 * - 纯静态方法，无状态
 * - 业务逻辑与实体类分离
 * - 便于单元测试
 * - 提高代码可维护性
 * 
 * @author convallaria
 * @since 1.0.0
 */
public class SysConfigUtils {

    // ==================== 配置类型判断方法 ====================

    /**
     * 判断是否为系统内置配置
     * 
     * @param config 配置对象
     * @return true=系统内置，false=用户自定义
     */
    public static boolean isSystemConfig(SysConfig config) {
        if (config == null || config.getConfigType() == null) {
            return false;
        }
        return ConfigConstants.isSystemConfig(config.getConfigType());
    }

    /**
     * 判断是否为用户自定义配置
     * 
     * @param config 配置对象
     * @return true=用户自定义，false=系统内置
     */
    public static boolean isUserConfig(SysConfig config) {
        if (config == null || config.getConfigType() == null) {
            return false;
        }
        return ConfigConstants.isUserConfig(config.getConfigType());
    }

    /**
     * 判断配置类型是否有效
     * 
     * @param configType 配置类型
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigType(String configType) {
        return ConfigConstants.isValidConfigType(configType);
    }

    // ==================== 配置键名判断方法 ====================

    /**
     * 判断配置键名是否为系统配置
     * 
     * @param config 配置对象
     * @return true=系统配置，false=用户配置
     */
    public static boolean isSystemConfigKey(SysConfig config) {
        if (config == null || config.getConfigKey() == null) {
            return false;
        }
        return ConfigConstants.isSystemConfigKey(config.getConfigKey());
    }

    /**
     * 判断配置键名是否为用户配置
     * 
     * @param config 配置对象
     * @return true=用户配置，false=系统配置
     */
    public static boolean isUserConfigKey(SysConfig config) {
        if (config == null || config.getConfigKey() == null) {
            return false;
        }
        return ConfigConstants.isUserConfigKey(config.getConfigKey());
    }

    // ==================== 数据验证方法 ====================

    /**
     * 验证配置信息是否完整
     * 
     * @param config 配置对象
     * @return true=完整，false=不完整
     */
    public static boolean isValidConfig(SysConfig config) {
        if (config == null) {
            return false;
        }
        
        // 必填字段验证
        if (!ConfigConstants.isValidConfigName(config.getConfigName())) {
            return false;
        }
        if (!ConfigConstants.isValidConfigKey(config.getConfigKey())) {
            return false;
        }
        if (config.getTenantId() == null) {
            return false;
        }
        
        // 配置类型验证
        if (!isValidConfigType(config.getConfigType())) {
            return false;
        }
        
        // 配置键值验证
        if (!ConfigConstants.isValidConfigValue(config.getConfigValue())) {
            return false;
        }
        
        return true;
    }

    /**
     * 验证配置名称格式
     * 
     * @param configName 配置名称
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigName(String configName) {
        return ConfigConstants.isValidConfigName(configName);
    }

    /**
     * 验证配置键名格式
     * 
     * @param configKey 配置键名
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigKey(String configKey) {
        return ConfigConstants.isValidConfigKey(configKey);
    }

    /**
     * 验证配置键值格式
     * 
     * @param configValue 配置键值
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigValue(String configValue) {
        return ConfigConstants.isValidConfigValue(configValue);
    }

    // ==================== 格式化方法 ====================

    /**
     * 格式化配置显示名称
     * 
     * @param config 配置对象
     * @return 格式化后的显示名称
     */
    public static String formatDisplayName(SysConfig config) {
        if (config == null) {
            return "未知配置";
        }
        
        String displayName = config.getConfigName();
        if (displayName == null || displayName.trim().isEmpty()) {
            displayName = config.getConfigKey();
        }
        
        return displayName != null ? displayName : "未知配置";
    }

    /**
     * 格式化配置完整信息
     * 
     * @param config 配置对象
     * @return 格式化后的完整信息
     */
    public static String formatConfigInfo(SysConfig config) {
        if (config == null) {
            return "配置信息为空";
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("配置ID: ").append(config.getConfigId()).append(", ");
        sb.append("配置名称: ").append(config.getConfigName()).append(", ");
        sb.append("配置键名: ").append(config.getConfigKey()).append(", ");
        sb.append("配置类型: ").append(getConfigTypeDesc(config.getConfigType())).append(", ");
        sb.append("配置键值: ").append(config.getConfigValue());
        
        return sb.toString();
    }

    /**
     * 格式化配置键名（添加前缀）
     * 
     * @param config 配置对象
     * @return 格式化后的配置键名
     */
    public static String formatConfigKey(SysConfig config) {
        if (config == null || config.getConfigKey() == null) {
            return "";
        }
        
        boolean isSystem = isSystemConfig(config);
        return ConfigConstants.formatConfigKey(config.getConfigKey(), isSystem);
    }

    /**
     * 清理配置键名（移除前缀）
     * 
     * @param config 配置对象
     * @return 清理后的配置键名
     */
    public static String cleanConfigKey(SysConfig config) {
        if (config == null || config.getConfigKey() == null) {
            return "";
        }
        
        return ConfigConstants.cleanConfigKey(config.getConfigKey());
    }

    /**
     * 清理配置名称（去除多余空格）
     * 
     * @param config 配置对象
     * @return 清理后的配置名称
     */
    public static String cleanConfigName(SysConfig config) {
        if (config == null || config.getConfigName() == null) {
            return "";
        }
        
        return ConfigConstants.cleanConfigName(config.getConfigName());
    }

    // ==================== 描述信息方法 ====================

    /**
     * 获取配置类型描述
     * 
     * @param configType 配置类型
     * @return 配置类型描述
     */
    public static String getConfigTypeDesc(String configType) {
        return ConfigConstants.getConfigTypeDesc(configType);
    }

    // ==================== 业务逻辑方法 ====================

    /**
     * 判断配置是否可以删除
     * 
     * @param config 配置对象
     * @return true=可以删除，false=不能删除
     */
    public static boolean canDelete(SysConfig config) {
        if (config == null) {
            return false;
        }
        
        // 系统内置配置不能删除
        if (isSystemConfig(config)) {
            return false;
        }
        
        // 用户自定义配置可以删除
        return isUserConfig(config);
    }

    /**
     * 判断配置是否可以编辑
     * 
     * @param config 配置对象
     * @return true=可以编辑，false=不能编辑
     */
    public static boolean canEdit(SysConfig config) {
        if (config == null) {
            return false;
        }
        
        // 所有配置都可以编辑
        return true;
    }

    /**
     * 判断配置是否可以使用
     * 
     * @param config 配置对象
     * @return true=可以使用，false=不能使用
     */
    public static boolean canUse(SysConfig config) {
        if (config == null) {
            return false;
        }
        
        // 所有配置都可以使用
        return true;
    }

    /**
     * 判断配置是否为空
     * 
     * @param config 配置对象
     * @return true=为空，false=不为空
     */
    public static boolean isEmpty(SysConfig config) {
        if (config == null) {
            return true;
        }
        
        return (config.getConfigName() == null || config.getConfigName().trim().isEmpty()) &&
               (config.getConfigKey() == null || config.getConfigKey().trim().isEmpty());
    }

    /**
     * 判断配置是否有效（非空且格式正确）
     * 
     * @param config 配置对象
     * @return true=有效，false=无效
     */
    public static boolean isValid(SysConfig config) {
        return !isEmpty(config) && isValidConfig(config);
    }

    /**
     * 判断配置键名是否重复
     * 
     * @param config1 配置对象1
     * @param config2 配置对象2
     * @return true=重复，false=不重复
     */
    public static boolean isConfigKeyDuplicate(SysConfig config1, SysConfig config2) {
        if (config1 == null || config2 == null) {
            return false;
        }
        
        String key1 = config1.getConfigKey();
        String key2 = config2.getConfigKey();
        
        if (key1 == null || key2 == null) {
            return false;
        }
        
        return key1.equals(key2);
    }

    /**
     * 判断配置名称是否重复
     * 
     * @param config1 配置对象1
     * @param config2 配置对象2
     * @return true=重复，false=不重复
     */
    public static boolean isConfigNameDuplicate(SysConfig config1, SysConfig config2) {
        if (config1 == null || config2 == null) {
            return false;
        }
        
        String name1 = config1.getConfigName();
        String name2 = config2.getConfigName();
        
        if (name1 == null || name2 == null) {
            return false;
        }
        
        return name1.equals(name2);
    }

    /**
     * 判断配置信息是否重复（键名或名称）
     * 
     * @param config1 配置对象1
     * @param config2 配置对象2
     * @return true=重复，false=不重复
     */
    public static boolean isConfigInfoDuplicate(SysConfig config1, SysConfig config2) {
        return isConfigKeyDuplicate(config1, config2) || isConfigNameDuplicate(config1, config2);
    }

    /**
     * 获取配置值（处理空值）
     * 
     * @param config 配置对象
     * @param defaultValue 默认值
     * @return 配置值或默认值
     */
    public static String getConfigValue(SysConfig config, String defaultValue) {
        if (config == null || config.getConfigValue() == null) {
            return defaultValue;
        }
        
        String value = config.getConfigValue().trim();
        return value.isEmpty() ? defaultValue : value;
    }

    /**
     * 获取配置值（处理空值，返回空字符串）
     * 
     * @param config 配置对象
     * @return 配置值或空字符串
     */
    public static String getConfigValue(SysConfig config) {
        return getConfigValue(config, "");
    }
}
